package com.ruoyi.common.utils.uuid;

import com.ruoyi.common.utils.DateUtils;

import java.util.concurrent.ThreadLocalRandom;

/**
 * ID生成器工具类
 *
 * @author ruoyi
 */
public class IdUtils {


    /**
     * 获取随机UUID
     *
     * @return 随机UUID
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID() {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 随机UUID
     */
    public static String fastUUID() {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID() {
        return UUID.fastUUID().toString(true);
    }

    /**
     * 短信验证码
     * @param codeLength
     * @return
     */
    public static String generateVerificationCode(int codeLength) {
        // 定义验证码字符集
        String codeChars = "0123456789";
        // 使用StringBuilder来拼接验证码
        StringBuilder verificationCode = new StringBuilder();
        // 创建Random对象
        ThreadLocalRandom random = ThreadLocalRandom.current();
        // 循环生成指定长度的验证码
        for (int i = 0; i < codeLength; i++) {
            // 从字符集中随机选择一个字符
            char randomChar = codeChars.charAt(random.nextInt(codeChars.length()));
            // 将选定的字符追加到验证码中
            verificationCode.append(randomChar);
        }
        // 返回生成的验证码字符串
        return verificationCode.toString();
    }

    /**
     * 生成订单号
     * @param prefix
     * @return
     */
    public static String genderOrderNum(String prefix) {
        return prefix+DateUtils.dateTimeNow()+generateVerificationCode(4);
    }

    /**
     * 生成32位无符号整数
     * @return
     */
    public static String get32UnsignedInteger(){
        long nextLong = ThreadLocalRandom.current().nextLong(0, 0xffffffffL);
        return Long.toString(nextLong);
    }

}
